import defineReactive from './defineReactive.js'
import observe from './observe.js';
import {
    vueArrayMethods
} from './array.js'
import {
    def
} from './utils.js'
import Dep from './Dep.js';

export default class Observer {
    constructor(data) {
        // 每一个Observer的实例身上，都有一个dep，这个是对象级（数组）的dep
        this.dep = new Dep();

        // 给实例（this，一定要注意，构造函数中的this不是表示类本身，而是表示实例）添加了__ob__属性，值是这次new的实例
        def(data, '__ob__', this, false);

        if (Array.isArray(data)) {
            // 如果是数组，要非常强行的蛮干：将这个数组的原型，指向vueArrayMethods
            Object.setPrototypeOf(data, vueArrayMethods)
            this.observeArray(data);
        } else {
            this.walk(data);
        }
    }

    walk(data) {
        for (let key in data) {
            defineReactive(data, key)
        }
    }

    // 数组的特殊遍历
    observeArray(data) {
        for (let i = 0, len = data.length; i < len; i++) {
            observe(data[i]);
        }
    }
}